function defineReactive(obj, key, val) {
  // 深度监听
  observer(val)
  Object.defineProperty(obj, key, {
    get() {
      return val
    },
    set(newVal) {
      if (newVal !== val){
        val = newVal
        // 通知更新
        updateView()
      }
    }
  })
}

// 监听对象
// 深度监听会导致一次性监听到底计算量要求特别大
// 新增/删除属性，监听不到
function observer(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj
  }
  // 重新定义对象
  Object.keys(obj).forEach(key => {
    defineReactive(obj, key, obj[key])
  })
}

function  updateView() {
  console.log('视图更新了')
}
